#include <regex>
#include <string>
#include <iostream>

/**
 * 首次做出来
 * 
 * 耗时很长、内存消耗很多
*/
int myAtoi(std::string s) {
    std::cout << "Max value of a 32-bit signed int: " << INT_MAX << std::endl;
    std::cout << "Min value of a 32-bit signed int: " << INT_MIN << std::endl;


    std::string number;

    for(char c : s){

            if(number.length()==0){
                //说明没匹配到数字
                if('-'==c||'+'==c){
                    number+=c;
                }else if('0'< c&&c <='9'){
                    number+='+';
                    number+=c;
                }else if('0'==c){
                    number+='+';
                }else if(' '==c){
                    continue;
                }else{
                    return 0;
                }
            }else if(number.length()==1){
                //说明已经明确了符号
                if('0'< c &&c <='9'){
                    number+=c;
                }else if('0'== c){
                    //这里说明明确符号，但紧接着的字符是 0 ，要舍弃
                    continue;
                }else{
                    return 0;
                }
            }else{
                //说明已经添加了数字
                 if('0'<= c && c <='9'){
                    number+=c;
                }else{
                    break;
                }
            }
           
    }

    if(number.length()<2){
            return 0;
    }else if(number.length()>11){
            if(number[0]=='+'){
                return INT_MAX;
            }else{
                return INT_MIN;
            }
    }else{
            //long 接收，比较最大值、最小值
           if(number[0]=='+'){
            number = std::string(number,1,number.length()-1);
           }
            std::cout << "number : " << number << std::endl;

          long value = std::stol(number);//转换为long

            std::cout << "number long: " << value << std::endl;
            if(value>INT_MAX){
                return INT_MAX;
            }else if(value<INT_MIN){
                return INT_MIN;
            }else{
                return static_cast<int>(value);
            }
    }
    return 0;
}

/**
 * 根据leetcode 下面评论进行优化
 * 
 * 优化点：
 * 1.避免使用long类型变量
 * 2.遍历一次
 * 3.在遍历时进行数据大小的判断
*/

int myAtoi2(std::string s){
    char sign = '*';
    int value=0;
    for(char c:s){
        if('0'<=c && c<='9' ){
            if(sign == '*'){
                sign = '+';
            }

            int digit = c - '0';//获取当前字符的int值。

            //数据大小判断，超出最大值、最小值范围，返回边界值；
            if(sign=='+'){
                if(value > INT_MAX / 10 ){
                    return INT_MAX;
                }else if(value == INT_MAX / 10 && digit >= INT_MAX % 10){
                    return INT_MAX;
                }else{
                     value = value*10+digit;
                }
            }else{
                if(value < INT_MIN / 10){
                    return INT_MIN;
                }else if(value == INT_MIN / 10 && (-digit) <= INT_MIN % 10){
                    return INT_MIN;
                }else{
                    value = value*10-digit;
                }
            }
        }else if('-'==c || '+'==c){
            if(sign=='*'){
                sign = c;
            }else{
                return value;
            }
        }else if(' '==c && sign=='*'){
            continue;
        }else{
            return value;
        }
    }

    return value;
}


/**
 * 评论里chatgpt输出的结果。
*/

int v(std::string str){
     if (str.empty()) return 0;
        int index = 0, n = str.size(), sign = 1, res = 0;
        // 处理前置空格
        while (index < n && str[index] == ' ') {
            ++index;
        }
        // 处理符号
        if (index < n && (str[index] == '+' || str[index] == '-')) {
            sign = str[index++] == '+' ? 1 : -1;
        }
        // 处理数字
        while (index < n && isdigit(str[index])) {
            int digit = str[index] - '0';
            // 判断是否溢出
            if (res > (INT_MAX - digit) / 10) {//这一步判断溢出有点难理解，其实就是保证十位以上组成的数值 >= res,一旦超过，可以确认越界了
                return sign == 1 ? INT_MAX : INT_MIN;//根据符号进行低位、高位的越界判断
            }
            res = res * 10 + digit;
            ++index;
        }
        return res * sign;
}

int main(){
      std::cout << "Max value of a 32-bit signed int: " << INT_MAX << std::endl;
    std::cout << "Min value of a 32-bit signed int: " << INT_MIN << std::endl;

     std::cout << "------------------------------ " << std::endl;

     std::cout<<"正-正常结果: "<<myAtoi2("214748367")<<std::endl;
     std::cout<<"正-正常结果: "<<myAtoi2("2147483647")<<std::endl;
      std::cout<<"负-正常结果: "<<myAtoi2("-2147483647")<<std::endl;

    std::cout<<"结果: "<<myAtoi2("21474836479")<<std::endl;

     std::cout<<"结果: "<<myAtoi2("-21474836479")<<std::endl;
}